package loginSystem;

import studentsystem.StudentSystem;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class userSystem {
    public static void main(String[] args) {
        //先创建一个集合存用户信息
        ArrayList<User> list=new ArrayList<>();
        Scanner sc=new Scanner(System.in);
        while (true){
            System.out.println("----------欢迎来到学生管理系统----------");
            System.out.println("请选择操作:");
            System.out.println("\t1登录");
            System.out.println("\t2注册");
            System.out.println("\t3忘记密码");
            switch (sc.next()){
                case "1":
                    login(list);
                    break;
                case "2":
                    register(list);
                    break;
                case "3":
                    forget();
                    break;
                default:
                    System.out.println("！！没有这个选项！！");
                    break;
            }
        }
    }
    //注册方法
    public static void register(ArrayList<User> list){
        Scanner sc=new Scanner(System.in);
        User u=new User();
        //判断用户名是否符合规则，符合=true
        boolean flag=true;
       do {
           System.out.println("----------开始输入用户名----------");
           System.out.printf("输入注册用户名：");
           u.setName(sc.next());
           flag=true;
           if (searchExist(list,u.getName())){
               System.out.println("！！用户名重复请重新输入！！");
               flag=false;
           }
           if(searchLength(u.getName())==false){
               System.out.println("！！用户名长度不符，需要在3~15位之间！！");
               flag=false;
           }
           if(searchContent(u.getName())==false){
               System.out.println("！！用户名内容不符，只能是字母加数字的组合，但是不能是纯数字！！");
               flag=false;
           }
       }while (flag==false);
       //判断密码输入
        while(true){
            System.out.println("----------开始输入密码----------");
            System.out.printf("请输入注册密码：");
            String s1=sc.next();
            System.out.printf("请再次输入注册密码（需与上一次一致）：");
            String s2=sc.next();
            if(s1.equals(s2)){
                u.setPassword(s1);
                break;
            }else{
                System.out.println("！！两次密码不一致，请重新输入！！");
            }
        }
        //输入身份证号并验证
        while (true){
            System.out.println("----------开始输入身份证号----------");
            System.out.printf("请输入注册身份证号：");
            String id=sc.next();
            if(searchID(id)){
                u.setId(id);
                break;
            }
        }
        //输入手机号并验证
        while (true){
            System.out.println("----------开始输入手机号----------");
            System.out.printf("请输入注册手机号：");
            String phoneNum=sc.next();
            if(searchPhoneNumber(phoneNum)){
                u.setPhoneNumber(phoneNum);
                break;
            }
        }
        list.add(u);
        System.out.println("！注册成功！");
    }
    //登录方法
    public static void login(ArrayList<User> list){
        Scanner sc=new Scanner(System.in);
        Random r=new Random();
        boolean start=false;
        loop:while(true) {
            if(list.size()==0){
                System.out.println("！！无用户信息，请先注册！！");
                break loop;
            }
            System.out.println("----------开始输入登录用户名----------");
            System.out.printf("请输入登录用户名：");
            String name = sc.next();
            if (searchExist(list, name) == false) {
                System.out.println("！！用户名未注册，请先注册！！");
                break;
            }
            System.out.println("----------开始输入登录密码----------");
            System.out.printf("请输入密码：");
            String enterPassword = sc.next();
            //验证验证码
            while (true) {
                int verification_code = r.nextInt(8999) + 1000;
                System.out.println("----------开始输入登录验证码----------");
                System.out.println("验证码：" + verification_code);
                System.out.printf("请输入验证码：");
                int enterVerCode = sc.nextInt();
                if (verification_code != enterVerCode) {
                    System.out.println("！！验证码错误，请重新输入！！");
                } else {
                    break;
                }
            }
            //验证密码
            int cnt = 3;//有三次机会
            if (namePassMatch(list, name, enterPassword)) {
                System.out.println("！登录成功！");
                start=true;
                break loop;
            } else {
                System.out.println("！！密码错误，请重新输入！！");
                cnt--;
                while (true) {
                    System.out.println("----------开始输入登录密码----------");
                    System.out.printf("请输入登录密码：");
                    enterPassword = sc.next();
                    if (namePassMatch(list, name, enterPassword)) {
                        System.out.println("！登录成功！");
                        start=true;
                        break loop;
                    } else {
                        if (cnt > 1) {
                            System.out.println("！！密码错误，请重新输入！！");
                            cnt--;
                        } else {
                            System.out.println("！！密码错误超过3次，正在返回主界面！！");
                            break loop;
                        }
                    }

                }
            }
        }
        if(start==true){
            String[] args=new String[1];
            StudentSystem.main(args);
        }

    }
    //忘记密码方法
    public static void forget(){
        Scanner sc=new Scanner(System.in);
    }
    //检查用户名是否存在,存在=true
    public static boolean searchExist(ArrayList<User> list,String name){
        for (int i = 0; i < list.size(); i++) {
            if(list.get(i).getName().equals(name)){
                return true;
            }
        }
        return false;
    }
    //通过用户名查找引索,找不到返回-1
    public static int searchIndex(ArrayList<User> list,String name){
        for (int i = 0; i < list.size(); i++) {
            if(list.get(i).getName().equals(name)){
                return i;
            }
        }
        return -1;
    }
    //检查用户名长度是否符合,false不符
    public static boolean searchLength(String name){
        if(name.length()<=3||name.length()>15){
            return false;
        }else{
            return true;
        }
    }
    //检查用户名内容是否符合,符合=true
    public static boolean searchContent(String name){
        //统计字母个数
        int cnt =0;
        for (int i = 0; i < name.length(); i++) {
            if((name.charAt(i)>='A'&&name.charAt(i)<='Z')||(name.charAt(i)>='0'&&name.charAt(i)<='9')||(name.charAt(i)>='a'&&name.charAt(i)<='z')){
                if((name.charAt(i)>='A'&&name.charAt(i)<='Z')||(name.charAt(i)>='a'&&name.charAt(i)<='z')){
                    cnt++;
                }
            }else{
                return false;
            }
        }
        if(cnt>0){
            return true;
        }else{
            return false;
        }
    }
    //检查身份证号是否符合，符合返回true
    public static boolean searchID(String id){
        boolean flag=true;
        //验证长度
        if(id.length()!=18){
            System.out.println("！！身份证号码长度不符，请重新输入！！");
            flag= false;
        }
        //是否以0开头
        if(id.charAt(0)=='0'){
            System.out.println("！！身份证号不能以0为开头，请重新输入！！");
            flag=false;
        }
        //检查前17位，是否都是数字
        for (int i = 0; i < id.length()-1; i++) {
            if(!(id.charAt(i)>='0'&&id.charAt(i)<='9')){
                System.out.println("！！前17位必须都是数字，请重新输入！！");
                flag=false;
                break;
            }
        }
        //检查最后一位是数字，或者是大写X或小写x
        if(id.charAt(id.length()-1)=='X'||id.charAt(id.length()-1)=='x'||(id.charAt(id.length()-1)>='0'&&id.charAt(id.length()-1)<='9')){

        }else{
            System.out.println("！！最后一位必须是数字或者X、x,请重新输入！！");
            flag=false;
        }
        return flag;
    }
    //检查手机号是否符合，符合返回true
    public static boolean searchPhoneNumber(String pnum){
        boolean flag=true;
        if(pnum.length()!=11){
            System.out.println("！！手机号码不符，必须是11位，请重新输入！！");
            flag=false;
        }
        if(pnum.charAt(0)=='0'){
            System.out.println("！！手机号码不符，不能以0开头，请重新输入！！");
            flag=false;
        }
        for (int i = 0; i < pnum.length(); i++) {
            if(pnum.charAt(i)>='0'&&pnum.charAt(i)<='9'){

            }else{
                System.out.println("！！手机号码不符，必须都是数字，请重新输入！！");
                flag=false;
                break;
            }
        }
        return flag;
    }
    //检查用户名和密码是否匹配,匹配返回true
    public static boolean namePassMatch(ArrayList<User> list,String name,String passWord){
        int index=searchIndex(list,name);
        if(list.get(index).getPassword().equals(passWord)){
            return true;
        }else{
            return false;
        }
    }
}
